

#include<vector>
#include<iostream>
using namespace std;

namespace tc{

template<class T>
class less{
    public:
    bool operator()(const T& x,const T& y){
        return x<y;
    }
};

template<class T,class Container=vector<T>,class Compare=less<T>>
class priority_queue {
    public:
    void adjust_up(size_t child){
        Compare com;
        size_t parent=(child-1)/2;
        while(child>0){
            if(com(_con[parent],_con[child])){
            //if(_con[parent]<_con[child]){
            swap(_con[child],_con[parent]);
            child=parent;
            parent=(child-1)/2;
            }
            else break;
           
        }
    }

    void adjust_down(size_t parent){
        Compare com;
        size_t child=parent*2+1;
        while(child<_con.size()){
            if(child+1<_con.size()&&com(_con[child],_con[child+1])){
                ++child;
            }
            if(com(_con[parent],_con[child])){
            //if(_con[parent]<_con[child]){
                swap(_con[parent],_con[child]);
                parent=child;
                child=parent*2+1;
            }else{
                break;
            }
        }
    }

    void push(const T& x){
        _con.push_back(x);
        adjust_up(_con.size()-1);
    }

    void pop(){
        swap(_con[0],_con[_con.size()-1]);
        _con.pop_back();
        adjust_down(0);
    }

    const T& top(){
        return _con[0];
    }

    bool empty(){
        return _con.empty();
    }

    size_t size(){
        return _con.size();
    }

    private:
    Container _con;

};

};


int main() {
    tc::priority_queue<int> pq;
    pq.push(5);
    pq.push(3);
    pq.push(8);
    pq.push(1);
    pq.push(7);

    while (!pq.empty()) {
        cout << pq.top() << " ";
        pq.pop();
    }
    cout << endl;

    return 0;
}